/*
有n个人围成一圈，顺序排号。从第一个人开始报数（从1到3报数），凡报到3的人退出圈子，问最后留下的是原来第几号的那位。
俗名猴子选大王
*/ 
#include<stdio.h> 
/*
int main() 
{ 
int a[100]; 
int i,n,p=0,q; 
printf("input number:"); 
scanf("%d",&n);  // 10 
q=n;// 场上剩余人数 
for(i=0;i<n;i++) a[i]=i+1;//初始编号
 
for(i=0;;i++) 
 { 
 if(i==n) i=0;   //循环继续下一轮 每个人都被过问， 但是淘汰的人没有发言权 
 if(a[i]!=0) p++;//这个人还可以 报数 
 else continue;  // 这个人被pass 我们下面定义的是当循环到三时，就赋值0，所以这边等0的不考虑在内
  
 if(p%3==0)     //这个就是从0一直加，到三的倍数(1~3) a[i]就赋值为0，从而就达到我们的目的//
  {a[i]=0;q--;} //淘汰掉一个人 总人数-1 
  
 if(q==1) break; //当剩下最后一个就输出//
 } 
 
for(i=0;i<n;i++) 
if(a[i]!=0) 
printf("spare: %d\n\n",a[i]); 
return 0; 
}
*/

int main() 
{ 
int a[100]; 
int i,n,p,q; 

printf("总人数:"); 
scanf("%d",&n);  // 

int *pp;//记录每个人状态 数组 元素的指针
pp =  a;//数组首地址 
for(i=0;i<n;i++) *(pp+i)=i+1; //初始编号 记录每个人的状态  非0为 活着

q=0;// 退出人数
p=0;// 报数 1 2 3 
i=0; 
while(q<n-1)//场上至少还有两人 执行   退出人数 小于 n-1
{ 
 if(*(pp+i) ! =0) p++;//这个人还可以 报数  还活着  进行报数 p = p+1;
  
 if( p == 3 )     // 1 2 3  如果报数为 3  需要淘汰 即 将相应状态置为 0
  {
  *(pp+i)=0;  //淘汰掉一个人 总人数-1 
  q++;// 淘汰人数 +1
  p=0;//报数 归0
  }
 i++; //遍历下一个人
 if(i==n) i=0;   //循环继续下一轮 每个人都被过问， 但是淘汰的人没有发言权 
 } 
 
while(*pp==0) pp++;//跳过被淘汰的人 

printf("最后一个是: %d\n\n",*pp); 
return 0; 
}
